#ifndef LIREMARTIALES_H
#define LIREMARTIALES_H 1

#include "ADDObjetBase.h"

#include <vector>

#include "Martiale.h"

#include "Parser.h"

#include "StatusCode.h"

#include "Singleton.h"

class ElementDOM;

/**
 * Classe qui crée la liste des armes disponibles à partir du fichier
 * Joueur0/Donnees/ListeArmes.xml. Cette classe possède une instance
 * de parseur et est capable de lire les compétences martiales.
 *
 * L'idée est d'avoir une unique instance de LireArmes, car il faut
 * lire le fichier xml et créer la liste pour chaque instance.
 *
 * @author Johan "Solo" Luisier
 */
class LireMartiales : public ADDObjetBase
{
 public:
  LireMartiales();
  ~LireMartiales();
  StatusCode init();
  const bool& initialisationOK() const;
  const std::vector< Martiale > * listeArmes() const;
  const std::vector< GLarge > * groupesLarges() const;
  static void setLevel( const unsigned & level, const unsigned& );
 protected:
  /**
   * Niveau de sortie des fonctions globales, très simples. On peut
   * changer cette constante en modifiant la ligne LireMartiales::elementaire
   * du fichier CONFIG.
   */ 
  static DebugLevelType elementaire;
  /**
   * Liste des compétences martiales.
   */
  std::vector< Martiale > ListeArmes;
  /**
   * Liste des groupes larges (et groupes restreints assimilé à un
   * groupe large).
   */
  std::vector< GLarge > GroupesLarges;
  /**
   * Parseur qui lit le fichier Joueur0/Donnees/ListeArmes.xml.
   */
  Parser parser;
 private:
 /**
  * Permet de déterminer si les niveaux de sorties ont bien été
  * initialisés.
  */                                                                           
  static bool niveauxLus;
  /**
   * Liste des noms des niveaux de sorties paramétrables.
   */
  static const std::vector< std::string > NomsNiveaux;
  /**
   *
   */
  bool InitialisationOK;
  /**
   * Structure permettant de gérer les groupes d'armes.
   */
  struct GroupeInfo
  {
    std::string NomGrp;       /**< Nom du groupe. */
    unsigned NumGrpLarge;     /**< Numéro du groupe large. */
    unsigned NumGrpRestreint; /**< Numére du groupe restreint. */
  };
  void initGrpInfo( GroupeInfo& grpInfo );
  std::vector< const ElementDOM * > trouverGroupes( const ElementDOM * elDom );
  std::string trouverNomGroupe( const ElementDOM * elDom );
  std::vector< const ElementDOM * > trouverArmes( const ElementDOM * elDom );
  std::string trouverNomArme( const ElementDOM * elDom );
  Martiale lireArme( const ElementDOM * elDom,
		     std::vector< const ElementDOM * > & enPlus,
		     const GroupeInfo& infos);
};

typedef Singleton< LireMartiales > UniqueLireMartiales;

//const LireMartiales * initLectureArmesXML();

//static LireMartiales * listeArmesXML = 0;

#endif // LIREMARTIALES_H
